Chapter 15 — Data Visualisation with Seaborn
Code Reference File — Copy and paste as needed

========================================
15.1.1 Import
========================================
import seaborn as sns
import matplotlib.pyplot as plt

========================================
15.2.1 Set Theme
========================================
sns.set_theme(style='whitegrid')

========================================
15.3.1 Bar Plot
========================================
plt.figure(figsize=(10, 6))
sns.barplot(data=sales_model, x='Product Line', y='Revenue', estimator='mean', ci=None,
            palette='Blues_d', hue='Product Line', legend=False)
plt.title('Average Revenue by Product Line')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()

========================================
15.3.2 Box Plot
========================================
plt.figure(figsize=(10, 6))
sns.boxplot(data=sales_model, x='Retailer Type', y='Revenue', palette='Set2',
            hue='Retailer Type', legend=False)
plt.title('Revenue Distribution by Retailer Type')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()

========================================
15.3.3 Count Plot
========================================
plt.figure(figsize=(8, 5))
order = sales_model['Order Method Type'].value_counts().index
sns.countplot(data=sales_model, x='Order Method Type', palette='Set3', order=order,
              hue='Order Method Type', legend=False)
plt.title('Transaction Count by Order Method Type')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()

========================================
15.4.1 Histogram with KDE
========================================
plt.figure(figsize=(8, 5))
sns.histplot(sales_model['Revenue'], bins=40, kde=True, color='steelblue')
plt.title('Distribution of Revenue')
plt.tight_layout()
plt.show()

========================================
15.4.2 KDE by Status
========================================
plt.figure(figsize=(8, 5))
sns.kdeplot(data=sales_model, x='Revenue', hue='Status', fill=True, alpha=0.4)
plt.title('Revenue Distribution: Local vs Global')
plt.tight_layout()
plt.show()

========================================
15.5.1 Regression Plot
========================================
sample = sales_model.sample(500, random_state=42)
plt.figure(figsize=(8, 6))
sns.regplot(data=sample, x='Sale Price', y='Revenue',
            scatter_kws={'alpha': 0.3}, line_kws={'color': 'red'})
plt.title('Sale Price vs Revenue')
plt.tight_layout()
plt.show()

========================================
15.6.1 Heatmap
========================================
numeric_cols = sales_model[['Sale Price', 'Quantity Sold', 'Revenue', 'Total Cost', 'Profit']].corr()
plt.figure(figsize=(8, 6))
sns.heatmap(numeric_cols, annot=True, fmt='.2f', cmap='Blues', linewidths=0.5)
plt.title('Correlation Heatmap')
plt.tight_layout()
plt.show()

========================================
15.7.1 Pair Plot
========================================
pair_data = sales_model[['Sale Price', 'Quantity Sold', 'Revenue', 'Profit', 'Status']].sample(500, random_state=42)
sns.pairplot(pair_data, hue='Status', plot_kws={'alpha': 0.3}, palette='Set1')
plt.suptitle('Pair Plot — Key Sales Metrics by Status', y=1.02)
plt.tight_layout()
plt.show()

========================================
15.8.1 Facet Grid
========================================
g = sns.FacetGrid(sales_model, col='Product Line', col_wrap=3, height=4, sharey=False)
g.map(sns.histplot, 'Revenue', bins=20, color='steelblue', kde=True)
g.set_titles('{col_name}')
g.set_axis_labels('Revenue', 'Frequency')
plt.suptitle('Revenue Distribution by Product Line', y=1.02)
plt.tight_layout()
plt.show()
